home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
magazyn_amiga
/
5
/
ami032_przeniesc_vbr.txt
< prev
next >
Wrap
Text File
|
1997-09-16
|
7KB
|
171 lines
PRZENIEÔÊ VBR
<lead>Gdy chcemy przyspieszyê komputer, kupujemy dopalacz i sporo
pamiëci. Po wîâczeniu wszelkich moûliwych burstów i cache'ów
rozkoszujemy sië prëdkoôciâ systemu i oglâdamy wyniki testów z
przekonaniem, ûe nic wiëcej nie da sië juû zrobiê. Czy
rzeczywiôcie?
<a>Michaî i Piotr Koîodziejczykowie
<txt>Wpîyw prëdkoôci przerwaï na wydajnoôê systemu jest zwykle
marginalizowany. I sîusznie, poniewaû w temacie tym niewiele da
sië zrobiê, a efekty i tak bëdâ prawie ûadne. Prawie. Niekiedy
jednak (np. przy transmisji szeregowej) przerwania wywoîywane sâ
parëdziesiât tysiëcy razy na sekundë. Informacje o przerwaniu
przechowywane sâ w pamiëci Chip, która, przy sprzyjajâcych
okolicznoôciach, jest dziesiëciokrotnie wolniejsza od pamiëci
Fast(*).
Procesor otrzymujâc przerwanie pobiera adres funkcji, która je
obsîuguje, z tablicy wektorów. Tablica ta (zawierajâca ponadto
wektory wyjâtków -- exeption) w procesorze MC68000 umieszczona
jest w pierwszych 512 bajtach pamiëci, czyli w pamiëci Chip.
Poczâwszy od procesora MC68010 tablicë wektorów umieszczaê moûna
w dowolnym obszarze pamiëci, a jej adres ustala nowy rejestr
procesora -- VBR (Vector Base Register). Zgodnie z zaîoûeniem
miaîo to umoûliwiê posiadanie przez kaûde z zadaï wîasnej tablicy
wektorów. W Amidze nie jest to wykorzystywane, VBR posîuûyê nam
moûe jednak do przeniesienia tablicy wektorów do pamiëci Fast.
Jednym z efektów takiego dziaîania bëdzie przyspieszenie
wykonywania przerwaï i wyjâtków.
Dostëp do rejestru VBR, jak i czëôci innych sterujâcych procesorem,
odbywa sië za pomocâ rozkazu movec, np.:
<l>movec a0,VBR ; wpisanie do VBR zawartoôci a0
movec CACR,d0 ; odczytanie trybu pracy pamiëci CACHE
; (od 68020 w górë)
<txt>Uwaga! Niektóre asemblery wymagajâ podania rozmiaru
operandu, czyli skîadni "movec.l".
Procesory z rodziny MC68000 projektowane byîy do pracy w
systemach wielozadaniowych. Zaîoûono, ûe procesor bëdzie pracowaî
w dwóch trybach: uûytkownika i nadzorcy. W trybie uûytkownika
wykonywane sâ wszelkie programy uûytkowe, natomiast tryb nadzorcy
zarezerwowany jest dla systemu operacyjnego.
Instrukcje sterujâce procesorem, ze wzglëdu na powaûne
konsekwencje ich bîëdnego uûycia, zostaîy zarezerwowane dla trybu
nadzorcy. Jednâ z takich instrukcji jest wîaônie interesujâca nas
movec. Jej wywoîanie z trybu uûytkownika koïczy sië obejrzeniem
GURU z numerem 00000008 (naruszenie przywileju).
Przed wykonaniem movec musimy wiëc przejôê do trybu nadzorcy, a
nastëpnie powróciê do trybu uûytkownika. Poniewaû metody zmiany
trybu pracy procesora nie byîy jeszcze nigdzie opisane, zajmiemy
sië tu nimi szerzej.
Biblioteka Exec oferuje dwa sposoby przejôcia do trybu nadzorcy.
Pierwszym z nich jest funkcja Supervisor(). Dla piszâcych w jëzyku C
ma ona takâ skîadnië:
<l>Wynik=Supervisor(Funkcja);
ULONG Supervisor(void *);
<txt>Przechodzi do trybu nadzorcy, wykonuje podanâ jej funkcjë
programisty i powraca w tryb uûytkownika. Adres funkcji podaje
sië w rejestrze A5. Dla funkcji programisty obowiâzujâ takie same
zasady, jak dla funkcji obsîugi przerwaï. Dodatkowo koïczyê musi
sië ona instrukcjâ rte. Przy powrocie do programu nie sâ
zmieniane rejestry -- pozostaje w nich to, co wpisaîa funkcja
programisty. Moûna to wykorzystaê do zwrotu wartoôci.
Supervisor() ma jednak wadë: Przy przejôciu do trybu nadzorcy
rejestr SP (Stack Pointer) nie wskazuje na dotychczasowy stos
uûytkownika, lecz na stos nadzorcy. Dlatego teû do wywoîywanej
funkcji (i z powrotem) nie moûna przekazywaê argumentów przez
stos.
Drugâ moûliwoôciâ zmiany trybu pracy sâ instrukcje SuperState() i
UserState(). Umoûliwiajâ one przejôcie do trybu nadzorcy i
uûytkownika w trakcie wykonywania programu, w dowolnym momencie.
<l>StosNadzorcy=SuperState();
APTR SuperState(void);
<txt>Przechodzi w tryb nadzorcy, przy czym SP wskazuje dalej na
stos uûytkownika (dotychczasowy). Moûna wiëc z niego do woli
korzystaê (zmienne klasy auto pozostajâ waûne). W rejestrze D0
otrzymujemy wskaúnik stosu nadzorcy. Nie jest on zwykle do
niczego potrzebny, naleûy go jednak zachowaê, gdyû konieczny
bëdzie przy powrocie do trybu uûytkownika.
<l>UserState(StosNadzorcy);
void UserState(APTR);
<txt>Powraca do trybu uûytkownika po wywoîaniu SuperState(). W
rejestrze D0 podaê musimy wskaúnik stosu nadzorcy, zwrócony przez
poprzedniâ funkcjë.
Uwaga! Na czas pomiëdzy SuperState() i UserState() stosem
nadzorcy bëdzie nasz stos uûytkownika. Musi byê na nim
odpowiednia iloôê miejsca dla ewentualnych przerwaï i wyjâtków.
Dla potrzeb programu przenoszâcego tablicë wektorów wygodniejsze
bëdzie skorzystanie z funkcji Supervisor().
Przed wykonaniem instrukcji movec musimy sië upewniê, czy w
komputerze zamontowany jest procesor MC68010 lub wyûszy.
Wykonanie movec na MC68000 zakoïczy sië GURU. O procesorze
informuje nas pole AttnFlags w bazie biblioteki Exec. W bajcie
tym ustawione sâ nastëpujâce bity w zaleûnoôci od rodzaju
procesora: 0 -- MC68010, 1 -- MC68020, 2 -- MC68030, 3 --
MC68040; dalsze bity odpowiadajâ za koprocesor. Ustawione sâ przy
tym wszystkie bity mîodsze, np. jeôli zainstalowany jest MC68020,
ustawione sâ bity 0 i 1.
I jeszcze krótki opis funkcji, wystëpujâcych w programie:
Forbid() i Permit() -- blokuje i odblokowuje wykonywanie innych
zadaï. Nie podaje sië im ûadnych argumentów, nie zwracajâ teû
ûadnej wartoôci. W programie wykorzystane w czasie kopiowania i
zmiany tablicy wektorów, by inny program w tym czasie nie zmieniî
ûadnego wektoru.
AllocMem() -- rezerwuje obszar pamiëci (w programie na nowâ
tablicë wektorów). W D0 podaje sië rozmiar, w D1 cechy pamiëci. W
D0 zwracany jest adres zarezerwowanego bloku lub 0, jeôli nie
moûna byîo go przydzieliê. Normalnie pamiëê powinna byê zwolniona
przez FreeMem() przed wyjôciem z programu, tu jednak musi ona
pozostaê zarezerwowana.
CopyMemQuick() -- kopiuje blok pamiëci. W A0 podaje sië jego
adres, w A1 adres docelowy, a w D0 rozmiar bloku. Wszystkie te
wartoôci muszâ byê podzielne przez 4.
Po sprawdzeniu procesora program sprawdza takûe zawartoôê rejestru
VBR -- jeôli jest róûna od 0, oznacza to, ûe tablica wektorów byîa
juû przemieszczana.
Poniûszy przykîadowy program, przemieszczajâcy tablicë wektorów
do pamiëci Fast, moûe byê kompilowany dowolnym asemblerem. Nie
wymaga ûadnych dodatkowych plików. Podczas kompilacji
prawdopodobnie otrzymamy ostrzeûenia o uûyciu instrukcji
procesora MC68010. Kod wynikowy bëdzie krótszy niû 200 bajtów.
Gdy tablica wektorów znajdzie sië w pamiëci Fast, niektóre gry i
dema mogâ sië zawieszaê (zakîadajâ one, ûe wektory znajdujâ sië
pod adresem 0 i uûywajâ wîasnych funkcji do ich zmiany).
******************** TU LISTING ******************
<przyp>(*) Dla niedowiarków:
Pamiëê Chip niezaleûnie od komputera (jak dotychczas) taktowana
jest zegarem ok. 7 MHz. Pamiëê Fast na kartach turbo, np. 33 MHz.
Mamy wiëc juû niemal 5-krotne przyspieszenie. Dodatkowo pamiëê
Chip, przy duûej liczbie kolorów i rozdzielczoôci obrazu, moûe
byê spowalniana przez ukîady graficzne. Do tego dochodzâ
koprocesory: Cooper i blitter. W efekcie dwukrotne spowolnienie
nietrudno uzyskaê. W sumie mamy 10 razy. A nie sâ to wartoôci
skrajne: mogâ byê bowiem jeszcze szybsze pamiëci Fast, a
maksymalne spowolnienie procesora na pamiëci Chip jest
trzykrotne.